/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */

package jp.ize.ux.components;
// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXController;
import jp.ize.ux.states.UXBasicState; 
import jp.ize.ux.components.UXComponent;
import jp.ize.ux.interactions.UXGeneralInteraction;
import jp.ize.ux.events.UXMouseEvent;
// }}}
// {{{ enum UXCellHAlign {
/**
 * 横方向の寄せ方です。
 */
enum UXCellHAlign {
	/** 左寄せ */
	LEFT;
	/** コンポーネントの中心線をセルの中心に重ねます。*/
	CENTER;
	/** 右寄せ */
	RIGHT;   
}
// }}}
// {{{ enum UXCellVAlign {
/**
 * 縦方向の寄せ方です。
 */
enum UXCellVAlign {
	/** 上寄せ */
	TOP;
	/** コンポーネントの中心線をセルの中心に重ねます。 */
	MIDDLE;
	/** 下寄せ */
	BOTTOM;   
}
// }}}
// {{{ class UXMargin
class UXMargin
{
	// {{{ public var top(default, default) : Float
	/**
	 * 上マージン
	 */
	public var top(default, default) : Float;
	// }}}
	// {{{ public var left(default, default) : Float
	/**
	 * 左マージン
	 */
	public var left(default, default) : Float;
	// }}}
	// {{{ public var bottom(default, default) : Float
	/**
	 * 下マージン
	 */
	public var bottom(default, default) : Float;
	// }}}
	// {{{ public var right(default, default) : Float
	/**
	 * 右マージン
	 */
	public var right(default, default) : Float;
	// }}}
	// {{{ public function new( t : Float, l : Float, b : Float, r : Float )
	/**
	 * コンストラクタ。
	 */
	public function new( t : Float, l : Float, b : Float, r : Float )
	{
		top    = t;
		left   = l;
		bottom = b;
		right  = r;
	}
	// }}}
}
// }}}
// {{{ class UXCellState extends UXBasicState
class UXCellState extends UXBasicState
{
	// {{{ public var item(default, null) : UXObject
	/**
	* テーブルの構成要素となるオブジェクトです。
	*/
	public var item(default, null) : UXObject;
	// }}}
	// {{{ public var valign(default, default) : UXCellVAlign
	/**
	* アイテムのセル中における縦方向の寄せ方です。
	* デフォルトは UXCellVAlign.TOP です。
	*/
	public var valign(default, default) : UXCellVAlign;
	// }}}
	// {{{ public var halign(default, default) : UXTableItemHAlign
	/**
	* アイテムのセル中における横方向の寄せ方です。
	* デフォルトは UXCellHAlign.LEFT です。
	*/
	public var halign(default, default) : UXCellHAlign;
	// }}}
	// {{{ public var margin(default, default) : UXMargin
	/**
	* 上下左右のマージンです。
	*/
	public var margin(default, default) : UXMargin;
	// }}}
	// {{{ public var row(default, default) : Int;
	/**
	* 行番号です。
	*/
	public var row(default, default) : Int;
	// }}}
	// {{{ public var col(default, default) : Int;
	/**
	* 列番号です。
	*/
	public var col(default, default) : Int;
	// }}}
	// {{{ public function new( uxo:UXObject )
	/**
	 * コンストラクタ。
	 *
	 * @param uxo: セル要素になるUXObjectです。
	 */
	public function new( uxo:UXObject )
	{
		super();
		this.item = uxo;
	}
	// }}}
}
// }}}

// {{{ class UXCell extends UXComponent<UXCellState>
class UXCell extends UXComponent<UXCellState>
{
	// {{{ public function new( uxo : UXObject ) 
	/**
	* コンストラクタです。構成要素となるオブジェクトを引数に渡します。
	*/
	public function new( uxo : UXObject ) 
	{
		state = new UXCellState(uxo);
		state.target = this;
		ctrl = new UXController<UXCellState>( state );
		ctrl.addInteraction( new UXCellClickInteraction() );
		ctrl.addInteraction( new UXCellRollOverInteraction() );
		ctrl.addInteraction( new UXCellRollOutInteraction() );
		super(ctrl);
		state.valign = UXCellVAlign.TOP;
		state.halign = UXCellHAlign.LEFT;
		state.margin = new UXMargin( 0,0,0,0 );
		addUXChild( state.item );
		ctrl.getInteraction("Click").addReactEvent(UXMouseEvent.CLICK);
		ctrl.getInteraction("RollOver").addReactEvent(UXMouseEvent.ROLL_OVER);
		ctrl.getInteraction("RollOut").addReactEvent(UXMouseEvent.ROLL_OUT);
	}
	// }}}
}
// }}}

// {{{ class UXCellClickInteraction extends UXGeneralInteraction<UXCellState>
/**
 * UXCellClickInteraction クラス<br>
 * ボタンの実行に対するデフォルトインタラクションです。
 */
class UXCellClickInteraction extends UXGeneralInteraction<UXCellState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("Click");
		this.judge = function(s) {
			return s.enabled;
		}
	}

	// }}}
}
// }}}
// {{{ class UXCellRollOverInteraction extends UXGeneralInteraction<UXCellState>
/**
 * UXCellRollOverInteraction クラス<br>
 * ボタンの実行に対するデフォルトインタラクションです。
 */
class UXCellRollOverInteraction extends UXGeneralInteraction<UXCellState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("RollOver");
		this.judge = function(s) {
			return s.enabled;
		}
	}

	// }}}
}
// }}}
// {{{ class UXCellRollOutInteraction extends UXGeneralInteraction<UXCellState>
/**
 * UXCellRollOutInteraction クラス<br>
 * ボタンの実行に対するデフォルトインタラクションです。
 */
class UXCellRollOutInteraction extends UXGeneralInteraction<UXCellState>
{
	// {{{ public function new() : Void
	/**
	* コンストラクタ
	*/
	public function new() : Void
	{
		super("RollOut");
		this.judge = function(s) {
			return s.enabled;
		}
	}

	// }}}
}
// }}}
